#include "viml/compiler.h"
#include "viml/instruction.h"
#include <gtest/gtest.h>

namespace viml {

class ForLoopTest : public ::testing::Test {
protected:
    Compiler compiler_;
};

TEST_F(ForLoopTest, SimpleForLoop) {
    // 测试简单的for循环编译
    auto result = compiler_.compile("for i in range(10) { echo i }");
    
    // 验证编译成功
    EXPECT_TRUE(result.success);
    EXPECT_TRUE(result.errors.empty());
    EXPECT_NE(result.function, nullptr);
    
    // 验证生成的字节码不为空
    const auto& bytecode = result.function->bytecode;
    EXPECT_FALSE(bytecode.empty());
    
    // 检查是否包含循环相关的指令（在Phase 0中可能只是基础实现）
    bool has_loop_instructions = false;
    for (const auto& instr : bytecode) {
        if (instr.opcode == OpCode::JMP || instr.opcode == OpCode::JMP_IF_TRUE || 
            instr.opcode == OpCode::JMP_IF_FALSE) {
            has_loop_instructions = true;
            break;
        }
    }
    
    // 在Phase 0中，我们可能还没有完整的for循环实现，所以这里只是验证编译器能处理
    // 而不是检查具体的指令序列
    EXPECT_NO_THROW(result = compiler_.compile("for i in range(10) { echo i }"));
}

TEST_F(ForLoopTest, ForLoopWithList) {
    // 测试遍历列表的for循环
    auto result = compiler_.compile("let list = [1, 2, 3]\nfor item in list { echo item }");
    
    // 验证编译成功
    EXPECT_TRUE(result.success);
    EXPECT_TRUE(result.errors.empty());
    EXPECT_NE(result.function, nullptr);
    
    // 验证生成的字节码不为空
    const auto& bytecode = result.function->bytecode;
    EXPECT_FALSE(bytecode.empty());
    
    // 在Phase 0中，我们可能还没有完整的for循环实现，所以这里只是验证编译器能处理
    EXPECT_NO_THROW(result = compiler_.compile("let list = [1, 2, 3]\nfor item in list { echo item }"));
}

} // namespace viml